﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Net;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Web.Services;
using System.Web.Services.Description;
using System.Web.Services.Protocols;
using System.Xml.Serialization;
using System.Configuration;
using System.Reflection;

namespace WHYHLWebservices
{
    public class YHLWebServiceGetter
    {
        private Type m_type = null;
        public bool GetWebServiceLocal()
        {
            try 
            {
                string webServiceUrl = ConfigurationManager.AppSettings["YHLUri"];  //获取配置文件的WebService地址
                // 1. 使用 WebClient 下载 WSDL 信息。  
                WebClient web = new WebClient();
                Stream stream = web.OpenRead(webServiceUrl + "?WSDL");

                // 2. 创建和格式化 WSDL 文档。  
                ServiceDescription description = ServiceDescription.Read(stream);

                // 3. 创建客户端代理代理类。  
                ServiceDescriptionImporter importer = new ServiceDescriptionImporter();

                importer.ProtocolName = "Soap"; // 指定访问协议。  
                importer.Style = ServiceDescriptionImportStyle.Client; // 生成客户端代理。  
                importer.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties | CodeGenerationOptions.GenerateNewAsync;

                importer.AddServiceDescription(description, null, null); // 添加 WSDL 文档。  

                // 4. 使用 CodeDom 编译客户端代理类。  
                CodeNamespace nmspace = new CodeNamespace(); // 为代理类添加命名空间，缺省为全局空间。  
                CodeCompileUnit unit = new CodeCompileUnit();
                unit.Namespaces.Add(nmspace);

                ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit);
                CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");

                CompilerParameters parameter = new CompilerParameters();
                parameter.GenerateExecutable = false;
                parameter.OutputAssembly = "YhlwebService.dll"; // 可以指定你所需的任何文件名。  
                parameter.ReferencedAssemblies.Add("System.dll");
                parameter.ReferencedAssemblies.Add("System.XML.dll");
                parameter.ReferencedAssemblies.Add("System.Web.Services.dll");
                parameter.ReferencedAssemblies.Add("System.Data.dll");

                CompilerResults result = provider.CompileAssemblyFromDom(parameter, unit);
                if (result.Errors.HasErrors)
                {
                    // 显示编译错误信息
                    LogHelper.WriteLog(typeof(YHLWebServiceGetter), "GetWebServiceLocal er:" + result.Errors);

                    return false;
                }  
            }
            catch(Exception er)
            {
                LogHelper.WriteLog(typeof(YHLWebServiceGetter), "GetWebServiceLocal er:" + er.Message);

                return false;
            }
            return true;
        }

        
        public bool MethodTest(string strData)
        {
            //生成本地DLL
            GetWebServiceLocal();
            //调用程序集文件演示  
            Assembly asm = Assembly.LoadFrom("YhlwebService.dll");
            Type t = asm.GetType("TRService");

            object o = Activator.CreateInstance(t);
            MethodInfo method = t.GetMethod("SendPassCarInfo_withImg");
            string result = (string)method.Invoke(o, new object[] { strData });

            if (result.Length==0)
            {
                return false;
            }

            return true;
        }

        public void InitMethod()
        {
            //调用程序集文件演示  
            Assembly asm = Assembly.LoadFrom("YhlwebService.dll");
            m_type = asm.GetType("TRService");
        }

        public string SendPassCarInfo(string strData)
        {
            string result = "";

            try 
            {
                if (m_type!=null) 
            {
                object o = Activator.CreateInstance(m_type);
                MethodInfo method = m_type.GetMethod("SendPassCarInfo_withImg");
                result = (string)method.Invoke(o, new object[] { strData });
            }
            }
            catch(Exception er)
            {
                LogHelper.WriteLog(typeof(YHLWebServiceGetter), "SendPassCarInfo 异常:" + er.Message);

            }

            return result;
        }         
    }
}
